// for(var i = 0; i < 10; i++){
//   setTimeout(function(){
//     console.log(i);
//   }, 100)
// }


// var elements = [{}, {}, {}]
// for(var i = 0; i < elements.length; i++){
//   elements[i].onclick = function(){
//     console.log(i)
//   }
// }

// for(let i = 0; i < 3; i++){
//   let i = 'foo';
//   console.log(i)
// }

// const arr = [100, 200, 300];

// // const [foo, bar, baz] = arr;
// const [foo, ...rest] = arr

// console.log(foo);
// console.log(rest);

// const path = '/foo/bar/baz'
// const [, root] = path.split('/')
// console.log(root);


// const obj = {name: 'zhangsan', age: 20}

// const {name = '', age = 0} = obj;


// console.log(name, age); // zhangsan 20

// const name = 'zs';

// const str = tag`hello, my name is ${name}`

// function tag(strings, name){
//   console.log(strings, name);
// }



// const message = "Error: foo is not defined."

// console.log(message.includes('foo'))
// console.log(message.startsWith('Error'))
// console.log(message.endsWith('.'))


// const p = {
//   name: '123',
//   sayName: () => {
//     console.log(this);
//     console.log(this.name);
//   }
// }

// p.sayName()


// const list = []
// const proxyList = new Proxy(list, {
//   set(target, property, value){
//     console.log(property, value);
//     target[property] = value
//     return true
//   }
// })

// proxyList.push(100)
// proxyList.push(100)
// proxyList.push(100)
// proxyList.push(100)
// proxyList.push(100)

// const obj = {}
// obj[123] = '123',
// obj[true] = true,
// obj[{name: 'zs'}] = {name: 'zs'}

// console.log(Object.keys(obj));


// const map = new Map()

// map.set('tom', 90)
// map.set({a: 12}, 'eqw')
// map.get('tom')
// map.has('tom')
// map.delete('tom')
// map.clear()

// console.log(map.size);

const s1 = Symbol.for('foo')
const s2 = Symbol.for('foo')
// console.log(s1 === s2);

// console.log(Symbol.iterator);
// console.log(Symbol.hasInstance);
// const obj = {
//   [Symbol.toStringTag]: "XObject",
//   name: 'zs'
// }
// console.log(Object.getOwnPropertySymbols(obj));
// let b = JSON.parse(JSON.stringify(obj))
// console.log(b.toString());


// const arr = [1, 2, 5, 3, 4]

// for(const item of arr){
//   console.log(item);
// }

// const obj1 = {
//   name: 'zs',
//   age: 18
// }

// for(const item of obj1){
//   console.log(item);
// }


// const set = new Set(['foo', 'bar', 'baz']);

// const iterator = set[Symbol.iterator]();
// console.log(iterator.next());
// console.log(iterator.next());
// console.log(iterator.next());
// console.log(iterator.next());

// const obj = {
//   store : ['foo', 'bar', 'baz'],
//   [Symbol.iterator]: function(){
//     let index = 0;
//     const self = this
//     return {
//       next: function(){ 
//         const result =  {
//           value: self.store[index],
//           done: index >= self.store.length
//         }
//         index ++;
//         return result
//       }
//     }
//   }
// }

// for(let item of obj){
//   console.log(item);
// }


const todos = {
  life: ['吃饭', '睡觉', '打豆豆'],
  learn: ['语文', '数学', '外语'],
  work: ['喝茶', '摸鱼'],
  [Symbol.iterator]: function*(){
    const all = [...this.life,...this.learn,...this.work ]
    for(const item of all){
      yield item;
    }
  }
}

for(const item of todos){
  console.log(item);
}

function * foo(){
  console.log(1);
  yield 100;
  console.log(2);
  yield 200;
  console.log(3);
  yield 300;
}

const f = foo();
console.log(f.next())
console.log(f.next())
console.log(f.next())

// 1
// { value: 100, done: false }
// 2
// { value: 200, done: false }
// 3
// { value: 300, done: false }

const idMaker =  function *(){
  let id = 1;
  while(true){
  	yield id++
  }
}
const idMakerIterator = idMaker();
// console.log(idMakerIterator.next().value);
// console.log(idMakerIterator.next().value);
// console.log(idMakerIterator.next().value);


const arr = [1, 2, NaN, 'foo'];

console.log(arr.indexOf('foo')); // 3
console.log(arr.indexOf(NaN));	 // false

console.log(arr.includes(NaN));

console.log(Math.pow(10, 2)) // 100

console.log(2 ** 10);


const obj = {
  name: 'zs',
  age: 19,
  sex: 1
}

// console.log(Object.values(obj));
// console.log(Object.entries(obj));

for(const [key, value] of Object.entries(obj)){
	console.log(key, value)
}

// name zs
// age 19
// sex 1

console.log(new Map(Object.entries(obj)));


const p1 = {
  firstName: "Kobe",
  lastName: "Bryant",
  get fullName(){
    return this.firstName + ' ' + this.lastName
  }
}
// console.log(p1.fullName);



// { firstName: 'Jordon',
//   lastName: 'Bryant',
//   fullName: 'Kobe Bryant' }
// Kobe Bryant


const descrptors = Object.getOwnPropertyDescriptors(p1);
const p2  = Object.defineProperties({}, descrptors);

p2.firstName = "Jordan"
// console.log(p2);
// console.log(p2.fullName);
// { firstName: 'Jordan', lastName: 'Bryant', fullName: [Getter] }
// Jordan Bryant


const books = {
  html: 5,
  css: 12,
  javascript: 128
}

for(const [name, value] of Object.entries(books)){
  console.log(`${name.padEnd(16, ' ')} | ${value.toString().padStart(5, ' ')}`)
}


// html             |     5
// css              |    12
// javascript       |   128


console.log('100' - 50);
